home *** CD-ROM | disk | FTP | other *** search
Wrap
CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) NNNNAAAAMMMMEEEE CCCCFFFFIIIIRRRRMMMM1111DDDD, ZZZZFFFFIIIIRRRRMMMM1111DDDD, SSSSFFFFIIIIRRRRMMMM1111DDDD, DDDDFFFFIIIIRRRRMMMM1111DDDD - Compute multiple 1D convolutions SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS Single precision complex Fortran: CCCCAAAALLLLLLLL CCCCFFFFIIIIRRRRMMMM1111DDDD ((((_x,,,, _i_n_c_x,,,, _l_d_x,,,, _i_x_0,,,, _n_x,,,, _n_s_e_q,,,, _h,,,, _i_n_c_h,,,, _i_h_0,,,, _n_h,,,, _y,,,, _i_n_c_y,,,, _l_d_y,,,, _i_y_0,,,, _n_y,,,, _a_l_p_h_a,,,, _b_e_t_a)))) C/C++: ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> vvvvooooiiiidddd ccccffffiiiirrrrmmmm1111dddd(((( ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_x,,,, iiiinnnntttt _i_n_c_x,,,, iiiinnnntttt _i_x_0,,,, iiiinnnntttt _n_x,,,, ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_h,,,, iiiinnnntttt _i_n_c_h,,,, iiiinnnntttt _i_h_0,,,, iiiinnnntttt _n_h,,,, ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_y,,,, iiiinnnntttt _i_n_c_y,,,, iiiinnnntttt _i_y_0,,,, iiiinnnntttt _n_y,,,, ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_a_l_p_h_a,,,, ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_b_e_t_a))));;;; C++ STL: ####iiiinnnncccclllluuuuddddeeee <<<<ccccoooommmmpppplllleeeexxxx....hhhh>>>> ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> vvvvooooiiiidddd ccccffffiiiirrrrmmmm1111dddd(((( ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_x,,,, iiiinnnntttt _i_n_c_x,,,, iiiinnnntttt _i_x_0,,,, iiiinnnntttt _n_x,,,, ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_h,,,, iiiinnnntttt _i_n_c_h,,,, iiiinnnntttt _i_h_0,,,, iiiinnnntttt _n_h,,,, ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_y,,,, iiiinnnntttt _i_n_c_y,,,, iiiinnnntttt _i_y_0,,,, iiiinnnntttt _n_y,,,, ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_a_l_p_h_a,,,, ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_b_e_t_a)))) Double precision complex Fortran: CCCCAAAALLLLLLLL ZZZZFFFFIIIIRRRRMMMM1111DDDD ((((_x,,,, _i_n_c_x,,,, _l_d_x,,,, _i_x_0,,,, _n_x,,,, _n_s_e_q,,,, _h,,,, _i_n_c_h,,,, _i_h_0,,,, _n_h,,,, _y,,,, _i_n_c_y,,,, _l_d_y,,,, _i_y_0,,,, _n_y,,,, _a_l_p_h_a,,,, _b_e_t_a)))) C/C++: ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> vvvvooooiiiidddd zzzzffffiiiirrrrmmmm1111dddd(((( ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_x,,,, iiiinnnntttt _i_n_c_x,,,, iiiinnnntttt _i_x_0,,,, iiiinnnntttt _n_x,,,, ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_h,,,, iiiinnnntttt _i_n_c_h,,,, iiiinnnntttt _i_h_0,,,, iiiinnnntttt _n_h,,,, ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_y,,,, iiiinnnntttt _i_n_c_y,,,, iiiinnnntttt _i_y_0,,,, iiiinnnntttt _n_y,,,, ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_a_l_p_h_a,,,, ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_b_e_t_a))));;;; C++ STL: ####iiiinnnncccclllluuuuddddeeee <<<<ccccoooommmmpppplllleeeexxxx....hhhh>>>> ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> vvvvooooiiiidddd zzzzffffiiiirrrrmmmm1111dddd(((( ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_x,,,, iiiinnnntttt _i_n_c_x,,,, iiiinnnntttt _i_x_0,,,, iiiinnnntttt _n_x,,,, ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_h,,,, iiiinnnntttt _i_n_c_h,,,, iiiinnnntttt _i_h_0,,,, iiiinnnntttt _n_h,,,, ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_y,,,, iiiinnnntttt _i_n_c_y,,,, iiiinnnntttt _i_y_0,,,, iiiinnnntttt _n_y,,,, ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_a_l_p_h_a,,,, ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_b_e_t_a))));;;; Single precision Fortran: CCCCAAAALLLLLLLL SSSSFFFFIIIIRRRRMMMM1111DDDD ((((_x,,,, _i_n_c_x,,,, _l_d_x,,,, _i_x_0,,,, _n_x,,,, _n_s_e_q,,,, _h,,,, _i_n_c_h,,,, _i_h_0,,,, _n_h,,,, _y,,,, _i_n_c_y,,,, _l_d_y,,,, _i_y_0,,,, _n_y,,,, _a_l_p_h_a,,,, _b_e_t_a)))) PPPPaaaaggggeeee 1111 CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) C/C++: ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> vvvvooooiiiidddd ssssffffiiiirrrrmmmm1111dddd(((( ffffllllooooaaaatttt *_x,,,, iiiinnnntttt _i_n_c_x,,,, iiiinnnntttt _i_x_0,,,, iiiinnnntttt _n_x,,,, ffffllllooooaaaatttt *_h,,,, iiiinnnntttt _i_n_c_h,,,, iiiinnnntttt _i_h_0,,,, iiiinnnntttt _n_h,,,, ffffllllooooaaaatttt *_y,,,, iiiinnnntttt _i_n_c_y,,,, iiiinnnntttt _i_y_0,,,, iiiinnnntttt _n_y,,,, ffffllllooooaaaatttt _a_l_p_h_a,,,, ffffllllooooaaaatttt _b_e_t_a))));;;; Double precision Fortran: CCCCAAAALLLLLLLL DDDDFFFFIIIIRRRRMMMM1111DDDD ((((_x,,,, _i_n_c_x,,,, _l_d_x,,,, _i_x_0,,,, _n_x,,,, _n_s_e_q,,,, _h,,,, _i_n_c_h,,,, _i_h_0,,,, _n_h,,,, _y,,,, _i_n_c_y,,,, _l_d_y,,,, _i_y_0,,,, _n_y,,,, _a_l_p_h_a,,,, _b_e_t_a)))) C/C++: ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> vvvvooooiiiidddd ddddffffiiiirrrrmmmm1111dddd(((( ddddoooouuuubbbblllleeee *_x,,,, iiiinnnntttt _i_n_c_x,,,, iiiinnnntttt _i_x_0,,,, iiiinnnntttt _n_x,,,, ddddoooouuuubbbblllleeee *_h,,,, iiiinnnntttt _i_n_c_h,,,, iiiinnnntttt _i_h_0,,,, iiiinnnntttt _n_h,,,, ddddoooouuuubbbblllleeee *_y,,,, iiiinnnntttt _i_n_c_y,,,, iiiinnnntttt _i_y_0,,,, iiiinnnntttt _n_y,,,, ddddoooouuuubbbblllleeee _a_l_p_h_a,,,, ddddoooouuuubbbblllleeee _b_e_t_a))));;;; IIIIMMMMPPPPLLLLEEEEMMMMEEEENNNNTTTTAAAATTTTIIIIOOOONNNN These routines are part of the SCSL Scientific Library and can be loaded using either the ----llllssssccccssss or the ----llllssssccccssss____mmmmpppp option. The ----llllssssccccssss____mmmmpppp option directs the linker to use the multi-processor version of the library. When linking to SCSL with ----llllssssccccssss or ----llllssssccccssss____mmmmpppp, the default integer size is 4 bytes (32 bits). Another version of SCSL is available in which integers are 8 bytes (64 bits). This version allows the user access to larger memory sizes and helps when porting legacy Cray codes. It can be loaded by using the ----llllssssccccssss____iiii8888 option or the ----llllssssccccssss____iiii8888____mmmmpppp option. A program may use only one of the two versions; 4-byte integer and 8-byte integer library calls cannot be mixed. The C and C++ prototypes shown above are appropriate for the 4-byte integer version of SCSL. When using the 8-byte integer version, the variables of type iiiinnnntttt become lllloooonnnngggg lllloooonnnngggg and the <<<<ssssccccssssllll____fffffffftttt____iiii8888....hhhh>>>> header file should be included. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN These routines compute the convolutions of the filter vector _h with each column of the two-dimenional array _x, producing the output two- dimensional array _y: _y = beta * _y + alpha * _h * _x Suppose _h is a sequence of _n_h elements and _X is a 2D matrix with _n_s_e_q columns, and _n_x elements in each column, as follows: h = [ h(0), h(1), , h(nh - 1) ] , and x(0, 0) x(0, 1) x(0, 2) x(0, nseq-1) x(1, 0) x(1, 1) x(1, 2) x(1, nseq-1) PPPPaaaaggggeeee 2222 CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) X = x(2, 0) x(2, 1) x(2, 2) x(2, nseq-1) ... ... ... ... ... x(nx-1, 0) x(nx-1, 1) x(nx-1, 2) x(nx-1, nseq-1) Then each column of the output matrix: y(0, 0) y(0, 1) y(0, 2) y(0, nseq-1) y(1, 0) y(1, 1) y(1, 2) y(1, nseq-1) Y = y(2, 0) y(2, 1) y(2, 2) y(2, nseq-1) ... ... ... ... ... y(ny-1, 0) y(ny-1, 1) y(ny-1, 2) y(ny-1, nseq-1) is obtained by convolving _h with the corresponding column of so that: MIN(i, nh-1) y(i,j)= Sum {h(k)*x(i-k,j)} k = MAX(0, i-nx+1) nh-1 y(i,j)= Sum {h(k)*x(i-k,j)} k=0 0 <=_i<_n_x, 0<=_j<_n_s_e_q That is: y(0,j)=h(0)*x(0,j) y(1,j)=h(0)*x(1,j) + h(1)*x(0,j) y(2,j)=h(0)*x(2,j) + h(1)*x(1,j)+h(2)*x(0,j) y(nh-1,j)=h(0)*x(nh-1,j) + h(1)*x(nh-2,j) + ... + h(nh-1)*x(0,j) ... y(k,j)=h(0)*x(k,j)+h(1)*x(k,j-1) + ... + h(nh-1)*x(k,j-nh+1) ... y(nx-1,j)=h(0)*x(nx-1,j) + h(1)*x(nx-2,j) + ... + h(nh-1)*x(nx-nh,j) ... y(nx+nh-3,j)=h(nh-2)*x(nx-1,j) + h(nh-1)*x(nx-2,j) y(nx+nh-2,j)=h(nh-1)*x(nx-1,j) In the ****FFFFIIIIRRRRMMMM1111DDDD routines, the number of terms in the each output column is specified by an argument, _n_y. If _n_y < _n_h + _n_x - 1 the columns of _y are truncated. If _n_y > _n_h + _n_x - 1 the terms beyond _y(_n_h + _n_x - 2) are set to 0. Generally, the sequences _x(:,_j), _h and _y(:,_j) represent signals sampled at equal time intervals, and the indexes of the vectors denote the sample times. If the signals begin at the same time, we may, without loss of generality, set the initial time to 0, as in the formulas above. PPPPaaaaggggeeee 3333 CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) The ****FFFFIIIIRRRRMMMM1111DDDD routines, however, permit more generality than this. The signals may be time shifted from each other using input parameters specifiying the initial time sample for each signal. This can be useful in several situations. For example, if the input array has several leading zero values that one does not wish to store, iiiixxxx0000 may be set to the time sample corresponding to the first non-zero element in the input array, and earlier time samples are treated as 0. Another use is to limit the output to just the "fully engaged" terms of the convolution. As can be seen above, when _n_x>= _n_h, the convolution has ramp-up and ramp-down regions in which fewer than all _n_h filter values contribute to the output value. Setting iiiiyyyy0000 to _n_h-1 causes the first value output to correspond to time sample _n_h-1, thus skipping the ramp-up region. Setting _n_y to _n_x-nh+1 then drops the ramp-down terms, limiting the output to just the fully engaged part. Note that, instead of 0, the initial time could just as easily have been labeled 1 or 10 or -78; the relevant point is that the first elements of each of the _x, _h and _y arrays are defined to be the same time sample as long as iiiixxxx0000 ==== iiiihhhh0000 ==== iiiiyyyy0000. See the NOTES section of this man page for information about the interpretation of the data types described in the following arguments. These routines have the following arguments: _x Array of dimension (_l_d_x, _n_s_e_q). (input). CCCCFFFFIIIIRRRRMMMM1111DDDD: Single precision complex array. ZZZZFFFFIIIIRRRRMMMM1111DDDD: Double precision complex array. SSSSFFFFIIIIRRRRMMMM1111DDDD: Single precision array. DDDDFFFFIIIIRRRRMMMM1111DDDD: Double precision array. Input sequences to be correlated with _h. _i_n_c_x Integer. (input) Increment between two successive values of a sequence in _x. _i_n_c_x must not be 0. _l_d_x Integer. (input) The number of rows in _x as it was declared in the calling program (the leading dimension of _x). _l_d_x >= MAX(_n_x * _i_n_c_x,1). _i_x_0 Integer. (input) Time sample corresponding to the first element of each 1D sequence of _x. _n_x Integer. (input) The number of elements in each sequence of _x. _n_x >= 0. _n_s_e_q Integer. (input) The number of sequences to which the convolution will be applied. _n_s_e_q >= 0. If _n_s_e_q = 0, the routine returns. PPPPaaaaggggeeee 4444 CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) _h Array of dimension _n_h. (input). CCCCFFFFIIIIRRRRMMMM1111DDDD: Single precision complex array. ZZZZFFFFIIIIRRRRMMMM1111DDDD: Double precision complex array. SSSSFFFFIIIIRRRRMMMM1111DDDD: Single precision array. DDDDFFFFIIIIRRRRMMMM1111DDDD: Double precision array. Input sequence to be convoluted with _x. _i_n_c_h Integer. (input) Increment between two successive values of _h. _i_n_c_h must not be 0. _i_h_0 Integer. (input) Time sample corresponding to the first element of _h. _n_h Integer. (input) The number of elements in the sequence _h. _n_h >= 0. If _n_h = 0, the routine returns. _y Array dimensioned (_l_d_y, _n_s_e_q). (output) CCCCFFFFIIIIRRRRMMMM1111DDDD: Single precision complex array. ZZZZFFFFIIIIRRRRMMMM1111DDDD: Double precision complex array. SSSSFFFFIIIIRRRRMMMM1111DDDD: Single precision array. DDDDFFFFIIIIRRRRMMMM1111DDDD: Double precision array. Output of the FIR filter. On entry, the array _y must have been initialized, except when _b_e_t_a is zero. In that case, _y need not be initialized. On exit, the result overwrites _y. _i_n_c_y Integer. (input) Increment between two successive values of a sequence in _y. _i_n_c_y must not be 0. _l_d_y Integer. (input) The number of rows in _y as it was declared in the calling program (the leading dimension of _y). _l_d_y >= MAX(_n_y * _i_n_c_y, 1). _i_y_0 Integer. (input) Time sample corresponding to the first element of each 1D sequence of _y. _n_y Integer. (input) Number of elements in each sequence of _y. _n_y >= 0. If _n_y = 0, the routine returns. _a_l_p_h_a Scale factor for the convolution. (input). CCCCFFFFIIIIRRRRMMMM1111DDDD: Single precision complex. ZZZZFFFFIIIIRRRRMMMM1111DDDD: Double precision complex. SSSSFFFFIIIIRRRRMMMM1111DDDD: Single precision. DDDDFFFFIIIIRRRRMMMM1111DDDD: Double precision. For C/C++, a pointer to this value is passed. PPPPaaaaggggeeee 5555 CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) _b_e_t_a Scale factor for the output _y. (input) CCCCFFFFIIIIRRRRMMMM1111DDDD: Single precision complex. ZZZZFFFFIIIIRRRRMMMM1111DDDD: Double precision complex. SSSSFFFFIIIIRRRRMMMM1111DDDD: Single precision. DDDDFFFFIIIIRRRRMMMM1111DDDD: Double precision. When _b_e_t_a is supplied as 0, _y need not be set on input. For C/C++, a pointer to this value is passed. NNNNOOOOTTTTEEEESSSS The following data types are described in this documentation: TTTTeeeerrrrmmmm UUUUsssseeeedddd DDDDaaaattttaaaa ttttyyyyppppeeee Fortran: Array dimensioned 0000........_n----1111 xxxx((((0000::::nnnn----1111)))) Array of dimensions (_m,_n) xxxx((((mmmm,,,,nnnn)))) Array of dimensions (_m,_n,_p) xxxx((((mmmm,,,,nnnn,,,,pppp)))) IIIInnnntttteeeeggggeeeerrrr IIIINNNNTTTTEEEEGGGGEEEERRRR (IIIINNNNTTTTEEEEGGGGEEEERRRR****8888 for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]]) Single precision RRRREEEEAAAALLLL Double precision DDDDOOOOUUUUBBBBLLLLEEEE PPPPRRRREEEECCCCIIIISSSSIIIIOOOONNNN Single precision complex CCCCOOOOMMMMPPPPLLLLEEEEXXXX Double precision complex DDDDOOOOUUUUBBBBLLLLEEEE CCCCOOOOMMMMPPPPLLLLEEEEXXXX C/C++: Array dimensioned 0000........_n----1111 xxxx[[[[_n]]]] Array of dimensions (_m,_n) xxxx[[[[mmmm****nnnn]]]] oooorrrr xxxx[[[[nnnn]]]][[[[mmmm]]]] Array of dimensions (_m,_n,_p) xxxx[[[[mmmm****nnnn****pppp]]]] oooorrrr xxxx[[[[pppp]]]][[[[nnnn]]]][[[[mmmm]]]] IIIInnnntttteeeeggggeeeerrrr iiiinnnntttt (lllloooonnnngggg lllloooonnnngggg for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]]) Single precision ffffllllooooaaaatttt Double precision ddddoooouuuubbbblllleeee Single precision complex ssssccccssssllll____ccccoooommmmpppplllleeeexxxx Double precision complex ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx C++ STL: PPPPaaaaggggeeee 6666 CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) Array dimensioned 0000........_n----1111 xxxx[[[[_n]]]] Array of dimensions (_m,_n) xxxx[[[[mmmm****nnnn]]]] oooorrrr xxxx[[[[nnnn]]]][[[[mmmm]]]] Array of dimensions (_m,_n,_p) xxxx[[[[mmmm****nnnn****pppp]]]] oooorrrr xxxx[[[[pppp]]]][[[[nnnn]]]][[[[mmmm]]]] IIIInnnntttteeeeggggeeeerrrr iiiinnnntttt (lllloooonnnngggg lllloooonnnngggg for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]]) Single precision ffffllllooooaaaatttt Double precision ddddoooouuuubbbblllleeee Single precision complex ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> Double precision complex ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> CCCCAAAAUUUUTTTTIIIIOOOONNNNSSSS The arrays _x, _h, and _y must be non-overlapping. EEEEXXXXAAAAMMMMPPPPLLLLEEEESSSS The following example computes the convolution of 5 4-sample sequences _x with a filter _h containing 3 samples: Fortran: REAL X(0:3,0:4), H(0:2), Y(0:5,0:4) REAL ALPHA, BETA ALPHA = 1.0 BETA = 0.0 DO J = 0, 4 X(0,J) = J + 1.0 DO I = 1, 3 X(I,J) = -1.0 - j ENDDO ENDDO DO I = 0, 2 H(I) = 1.0/(I+1) ENDDO CALL SFIRM1D(X(0,0), 1, 4, 0, 4, 5, H(0), 1, 0, 3, & Y(0,0), 1, 6, 0, 6, ALPHA, BETA) C/C++: #include <scsl_fft.h> float x[5][4], h[3], y[5][6]; float alpha = 1.0f; float beat = 0.0f; int i, j; for (j=0; j<5; j++) { PPPPaaaaggggeeee 7777 CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) x[j][0] = j + 1.0f; for (i=1; i<4; i++) { x[j][i] = -1.0f - j; } } for (i=0; i<3; i++) { h[i] = 1.0f/(i+1); } sfirm1d((float *) x, 1, 4, 0, 4, 5, h, 1, 0, 3, (float *) y, 1, 6, 0, 6, alpha, beta); The output is Y(:,0) Y(:,1) Y(:,2) Y(:,3) Y(:,4) Y(0,:) 1.0000 2.0000 3.0000 4.0000 5.0000 Y(1,:) -0.5000 -1.0000 -1.5000 -2.0000 -2.5000 Y(2,:) -1.1667 -2.3333 -3.5000 -4.6667 -5.8333 Y(3,:) -1.8333 -3.6667 -5.5000 -7.3333 -9.1667 Y(4,:) -0.8333 -1.6667 -2.5000 -3.3333 -4.1667 Y(5,:) -0.3333 -0.6667 -1.0000 -1.3333 -1.6667 Changing the values for ix0, ih0 and iy0 produces the following shifts in the output: ix0 = +1 Y(:,0) Y(:,1) Y(:,2) Y(:,3) Y(:,4) Y(0,:) 0.0000 0.0000 0.0000 0.0000 0.0000 Y(1,:) 1.0000 2.0000 3.0000 4.0000 5.0000 Y(2,:) -0.5000 -1.0000 -1.5000 -2.0000 -2.5000 Y(3,:) -1.1667 -2.3333 -3.5000 -4.6667 -5.8333 Y(4,:) -1.8333 -3.6667 -5.5000 -7.3333 -9.1667 Y(5,:) -0.8333 -1.6667 -2.5000 -3.3333 -4.1667 ih0 = -1 Y(:,0) Y(:,1) Y(:,2) Y(:,3) Y(:,4) Y(0,:) -0.5000 -1.0000 -1.5000 -2.0000 -2.5000 Y(1,:) -1.1667 -2.3333 -3.5000 -4.6667 -5.8333 Y(2,:) -1.8333 -3.6667 -5.5000 -7.3333 -9.1667 Y(3,:) -0.8333 -1.6667 -2.5000 -3.3333 -4.1667 Y(4,:) -0.3333 -0.6667 -1.0000 -1.3333 -1.6667 Y(5,:) 0.0000 0.0000 0.0000 0.0000 0.0000 iy0 = -1 Y(:,0) Y(:,1) Y(:,2) Y(:,3) Y(:,4) Y(0,:) 0.0000 0.0000 0.0000 0.0000 0.0000 Y(1,:) 1.0000 2.0000 3.0000 4.0000 5.0000 Y(2,:) -0.5000 -1.0000 -1.5000 -2.0000 -2.5000 Y(3,:) -1.1667 -2.3333 -3.5000 -4.6667 -5.8333 Y(4,:) -1.8333 -3.6667 -5.5000 -7.3333 -9.1667 Y(5,:) -0.8333 -1.6667 -2.5000 -3.3333 -4.1667 PPPPaaaaggggeeee 8888 CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) CCCCFFFFIIIIRRRRMMMM1111DDDD((((3333SSSS)))) SSSSEEEEEEEE AAAALLLLSSSSOOOO CCCCCCCCOOOORRRR1111DDDD(3S), IIIINNNNTTTTRRRROOOO____FFFFFFFFTTTT(3S), IIIINNNNTTTTRRRROOOO____SSSSCCCCSSSSLLLL(3S PPPPaaaaggggeeee 9999